我們之前都是製作一個request來然後一個response回去的基本款,其實大部分的傳遞都是屬於這種類型的傳遞方式。
接下來我們要開始嘗試實作有stream種類的傳遞模式。
今天我們要開始來看第二種,client單發對server多發,這邊我們會使用同步以及非同步的method各別來實作一次。
我們先在.proto檔的IronManService中新增Client2Servers這個method
service IronManService{
rpc IronMan01(IronManRequest01) returns (IronManResponse01) {}
rpc IronMan02(IronManRequest02) returns (IronManResponse02) {}
rpc Client2Servers(IronManRequest01) returns (stream IronManResponse01) {}
}
重新執行protobuf讓method生成。
然後我們在IronManServiceImpl中override剛才新設定的method,
因為client的request是一個訊息過來,因此只要接收一組訊息即可,所以我們可以這樣實作
@Override
public void client2Servers(IronManProto.IronManRequest01 request, StreamObserver<IronManProto.IronManResponse01> responseObserver) throws InterruptedException {
String name = request.getName();
String age = request.getAge();
System.out.println("我收到client的Name訊息: " + name);
System.out.println("我收到client的Age訊息: " + age);
for(int i = 0 ; i < 10 ; i++){
//設定好回傳的response
IronManProto.IronManResponse01.Builder builder = IronManProto.IronManResponse01.newBuilder();
builder.setResult("我接收到client的訊息,現在是第 " + i + " 秒");
IronManProto.IronManResponse01 ironManResponse01 = builder.build();
responseObserver.onNext(ironManResponse01);
Thread.sleep(1000);
}
responseObserver.onCompleted();
}
一樣透過get函式取得request的內容,然後使用for迴圈將資料傳遞回client端,並且用sleep()讓每次回傳的區間都間隔一秒。
這樣就透過server端實作出多發的response給client端,明天我們就來實作client端的部分吧。